/*
 * ConvertitoreMoneta.java
 *
 * Created on 20. settembre 2008, 10:00
 *
 */
package org.monopoly.moneta;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;

/**
 * Questa classe (Sigleton) legge da Internet i vari cambi valuta ogni ora.
 * È da notare che per utilizzarla bosigna (esempio):
 * <code>ConvertitoreMoneta.getIstanza().Converti("CHF","EUR",(float)100)</code>
 *
 * @author Davide Böhny
 *
 */
public class ConvertitoreMoneta implements Runnable {

    private static ConvertitoreMoneta istanza = null;
    private static String[] valute = {"CHF", "EUR", "USD"};
    private final static ArrayList<CambioMoneta> cambi = new ArrayList<CambioMoneta>();
    private static boolean letto = false;

    private ConvertitoreMoneta() {
        new Thread(this).start();
    }

    public static ConvertitoreMoneta getIstanza() {
        if (istanza == null) {
            istanza = new ConvertitoreMoneta();
        }
        return istanza;
    }

    /**
     * Questo metodo statico permette la conversione da una valuta all'altra
     *
     * @param da Da che valuta si desidera convertire. Esempio: "CHF"
     * @param a In che valuta si desidera convertire. Esempio: "EUR"
     * @param ammontare Cifra che si desidera convertite
     * @return
     */

    public float Converti(String da, String a, float ammontare){
        if(letto == false){
            for(;;){
                try{
                    Thread.sleep(100);
                    if(letto == true) break;
                }catch(Exception e){
                }
            }
        }
        synchronized(cambi){
            for(CambioMoneta c: cambi){
                if(da.equalsIgnoreCase(c.getDa()) && a.equalsIgnoreCase(c.getA())){
                    System.out.println(da + "//" + a + "//" + c.getCambio());
                    return ammontare*c.getCambio();
                }
            }
        }
        return (float)0.0;
    }

    public void run() {
        for (;;) {
            try {
                ArrayList<CambioMoneta> ris = new ArrayList<CambioMoneta>();
                for (int i = 0; i < valute.length; i++) {
                    String s = valute[0] + valute[i];
                    URL url = new URL("http://it.finance.yahoo.com/d/quotes.csv?s=" + s + "=X");
                    BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
                    String str;
                    StringBuffer tutto = new StringBuffer();
                    while ((str = in.readLine()) != null) {
                        tutto.append(str);
                    }
                    in.close();

                    String[] arr = tutto.toString().split(";");
                    arr[2] = arr[2].replace(',', '.');
                    float cambio = Float.parseFloat(arr[2]);
//                    System.out.println(s + "//" + cambio);

                    //Aggiungo i due cambi...
                    ris.add(new CambioMoneta(valute[0], valute[i], cambio));
                    ris.add(new CambioMoneta(valute[i], valute[0], 1 / cambio));
                }

                //Salvo i risultati in cambi in modo sincronizzato,
                //poiché se sto effettuando una conversione e un aggiornamento
                //cambi contemporanemante potrebbe essere un problema!
                synchronized (cambi) {
                    cambi.clear();
                    cambi.addAll(ris);
                    letto = true;
                }

                //Ogni ora aggiorno i cambi!
                for(int i = 0; i < 60; i++){
                    Thread.sleep(60000);
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    class CambioMoneta {

        private String da;
        private String a;
        private float cambio;

        public CambioMoneta(String da, String a, float cambio) {
            this.da = da;
            this.a = a;
            this.cambio = cambio;
        }

        public String getDa() {
            return da;
        }

        public void setDa(String da) {
            this.da = da;
        }

        public String getA() {
            return a;
        }

        public void setA(String a) {
            this.a = a;
        }

        public float getCambio() {
            return cambio;
        }

        public void setCambio(float cambio) {
            this.cambio = cambio;
        }
    }
}
